/*
 * HPDL1414驱动
 * SUMMERY:YIZHOU WANG MAY15.2021
 * 
 * VER0.1 BETA MAY15.2021
 * 为ARDUINO NANO适配HPDL1414数码管
 * HINT:由于目前该元件已经停产并且购买的人较多，价格已经是原来的5倍，不建议目前购买该元件
 * 存在bug，无法显示数字，无法判定是元件问题还是程序问题
 * 
*/
#define DAT0 2
#define DAT1 3
#define DAT2 4
#define DAT3 5
#define DAT4 6
#define DAT5 7//7个数据管脚，服从ASCII定义
#define DAT6 8

#define ADDR0 9
#define ADDR1 10//地址线

#define WR 11//写保护，默认低电平
void setup() {
  pinMode(DAT0,OUTPUT);
  pinMode(DAT1,OUTPUT);
  pinMode(DAT2,OUTPUT);
  pinMode(DAT3,OUTPUT);
  pinMode(DAT4,OUTPUT);
  pinMode(DAT5,OUTPUT);
  pinMode(ADDR0,OUTPUT);
  pinMode(ADDR1,OUTPUT);
  pinMode(WR,OUTPUT);

  digitalWrite(WR,LOW);

}
void Setupaddr(int addr)
{
    switch(addr)
    {
      case 0:
      {
        digitalWrite(ADDR0,LOW);
        digitalWrite(ADDR1,LOW);
        break;
        }
      case 1:
      {
        digitalWrite(ADDR0,HIGH);
        digitalWrite(ADDR1,LOW);
        break;
        }
      case 2:
      {
        digitalWrite(ADDR0,LOW);
        digitalWrite(ADDR1,HIGH);
        break;
        }
      case 3:
      {
        digitalWrite(ADDR0,HIGH);
        digitalWrite(ADDR1,HIGH);
        break;
        }
        default:
        {
          }
      }
  }
void PrintCharHPDL1414(int DA0,int DA1,int DA2,int DA3,int DA4,int DA5,int DA6,char text)
{
  byte DA0sta=(text)&0x01;
  byte DA1sta=(text)&0x02;
  byte DA2sta=(text)&0x04;
  byte DA3sta=(text)&0x08;
  byte DA4sta=(text)&0x10;
  byte DA5sta=(text)&0x20;
  byte DA6sta=(text)*0x40;//将ASCII值转换为7个位


    digitalWrite(WR,HIGH);
    
    
    if(DA0sta==0)
    {
      digitalWrite(DA0,LOW);
      }
      else
      {
        digitalWrite(DA0,HIGH);
        }//对第一位数据进行传输

    if(DA1sta==0)
    {
      digitalWrite(DA1,LOW);
      }
      else
      {
        digitalWrite(DA1,HIGH);
        } //对第二位数据进行传输
    if(DA2sta==0)
    {
      digitalWrite(DA2,LOW);
      }
      else
      {
        digitalWrite(DA2,HIGH);
        }//对第三位数据进行传输

    if(DA3sta==0)
    {
      digitalWrite(DA3,LOW);
      }
      else
      {
        digitalWrite(DA3,HIGH);
        } //对第四位数据进行传输
     if(DA4sta==0)
    {
      digitalWrite(DA4,LOW);
      }
      else
      {
        digitalWrite(DA4,HIGH);
        }//对第五位数据进行传输

    if(DA5sta==0)
    {
      digitalWrite(DA5,LOW);
      }
      else
      {
        digitalWrite(DA5,HIGH);
        } //对第六位数据进行传输
    if(DA6sta==0)
    {
      digitalWrite(DA6,LOW);
      }
      else
      {
        digitalWrite(DA6,HIGH);
        } //对第七位数据进行传输
      digitalWrite(WR,LOW);
      delay(5);
      text++;
  
}
void PrintCharByString(char* label)//莫名奇妙的问题...写2和0位会莫名干扰1和3位，于是我先写2和0位再写1和3位了。顺序BDCA，2431,而且数字字库貌似出了问题，不能显示数字
{
  label=&(*label);
  
  label=label+1;
  Setupaddr(2);
  PrintCharHPDL1414(DAT0,DAT1,DAT2,DAT3,DAT4,DAT5,DAT6,*label);
  
  label=label+2;
  Setupaddr(0);
  PrintCharHPDL1414(DAT0,DAT1,DAT2,DAT3,DAT4,DAT5,DAT6,*label);

  label=label-1;
  Setupaddr(1);
  PrintCharHPDL1414(DAT0,DAT1,DAT2,DAT3,DAT4,DAT5,DAT6,*label);
  
  label=label-2;
  Setupaddr(3);
  PrintCharHPDL1414(DAT0,DAT1,DAT2,DAT3,DAT4,DAT5,DAT6,*label);
  delay(50);
    }
void loop() {
  PrintCharByString("YAML");
 /* Setupaddr(0);
  PrintCharHPDL1414(DAT0,DAT1,DAT2,DAT3,DAT4,DAT5,DAT6,0x38);*/
}
